查看原文
其他

使用 Jetpack App Startup 库减少应用启动时间

Android Android 开发者 2021-08-05

作者 / Yacine Rezgui

 

应用启动时间是应用性能的关键衡量指标。应用启动后,用户期望能够得到快速响应并加载内容,当不符合预期时用户会感到失望。这种糟糕的体验可能会导致用户在 Play 商店上对您的应用给予低分数的评价,甚至不会再次使用。
 
Jetpack App Startup 库在应用启动时以一种简单、高效的方法来初始化组件。库开发者和应用开发者都可以使用 App Startup 简化启动流程,并显式指定初始化顺序。
 
应用和库往往需要在 Application.onCreate() 之前初始化组件,如: WorkManagerProcessLifecycleObserverFirebaseApp 等。这往往通过使用 ContentProvider 来实现不同依赖的初始化。通过 App Startup,您无需为每个组件单独定义 ContentProvider 进行初始化,而可以定义多个 Initializer 去共享相同的 ContentProvider。每减少一个 ContentProvider 通常会有约 2ms 的收益,这可以显著提高应用启动速度。App Startup 还可以简化延迟初始化组件操作,从而帮助您进一步提高启动性能。当 App Startup 进入稳定版本后,我们将更新诸如 WorkManager 和 ProcessLifecycle 之类的库,以从中受益。
 
App Startup 支持 API 14 及以上。

  • Jetpack App Startup

    https://developer.android.google.cn/topic/libraries/app-startup

  • 延迟初始化组件

    https://developer.android.google.cn/topic/libraries/app-startup#disable-individual



 如何使用


配置 Gradle


为了在您的依赖库或应用中使用 App Startup,您需要在 Gradle 文件中添加如下依赖项:

repositories { google() maven()}dependencies {  implementation "androidx.startup:startup-runtime:1.0.0"}

定义 Initializer


为了在应用中使用 App Startup,您需要定义一个 Initializer。您可以在此定义如何初始化以及指定依赖其他的 Initializer。这是您需要实现的接口:
interface Initializer<out T: Any> { fun create(context: Context): T fun dependencies(): List<Class<out Initializer<*>>>}

  • Initializer
    https://developer.android.google.cn/topic/libraries/app-startup#implement-initializers

在实际案例中,初始化 WorkManager 的 Initializer 可能如下:
class WorkManagerInitializer : Initializer<WorkManager> { override fun create(context: Context): WorkManager { val configuration = Configuration.Builder() .setMinimumLoggingLevel(Log.DEBUG) .build() WorkManager.initialize(context, configuration) return WorkManager.getInstance(context) } // 此组件无需任何依赖 override fun dependencies() = emptyList<Class<out Initializer<*>>>()}

提示: 此示例为纯粹说明性质,该 Initializer 实际上应该由 WorkManager 依赖库定义。

 

最后,我们需要在 AndroidManifest.xml 中增加 WorkManagerInitializer 条目:
<provider android:name="androidx.startup.InitializationProvider" android:authorities="${applicationId}.androidx-startup" android:exported="false" tools:node="merge"> <!-- This entry makes WorkManagerInitializer discoverable. --> <meta-data android:name="com.example.WorkManagerInitializer" android:value="androidx.startup" /></provider>


 工作原理


App Startup 使用了一个名为 InitializationProvider 的 ContentProvider。该 ContentProvider 在合并后的 AndroidManifest.xml 文件中查找 <meta-data> 条目来发现 Initializer。此过程发生在 Application.onCreate() 被调用之前。
 
完成上一阶段之后,加载组件之前会先加载该组件的所有依赖项。因此,可以确保组件的所有依赖项都已完成初始化后才对其进行初始化。


 延迟初始化


我们强烈推荐您使用延迟初始化来进一步提升启动性能,您可以通过如下方式实现组件的延迟初始化,在 <meta-data> 条目下为 Initializer 增加 tools:node="remove" 属性,这将禁用即时初始化:
<provider android:name="androidx.startup.InitializationProvider" android:authorities="${applicationId}.androidx-startup" android:exported="false" tools:node="merge">
<!-- 禁用即时初始化 --> <meta-data android:name="com.example.WorkManagerInitializer" tools:node="remove" /></provider>

为了实现 WorkManagerInitializer 的延迟初始化,您可以进行如下操作:
// 此处返回一个 WorkManager 的实例AppInitializer.getInstance(context)    .initializeComponent(WorkManagerInitializer.class);

至此,您的应用已经延迟初始化该组件了。您可以阅读我们的详细文档

  • 详细文档
    https://developer.android.google.cn/topic/libraries/app-startup#disable-individual


 最后


App Startup 目前处于 1.0.0 版本。您可以从我们的文档中找到有关如何使用它的更多信息。如果您在使用中出现任何问题,请及时向我们反馈问题,以帮助我们更好地改进。

  • 文档
    https://developer.android.google.cn/topic/libraries/app-startup
  • 反馈问题
    https://issuetracker.google.com/components/823348#basic


 点击屏末 | 阅读原文 | 即刻了解 Jetpack App Startup 库



推荐阅读





    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存